//
// Created by tcj on 2022/7/16.
//

#ifndef WEB_TEST_HTTPRESPONSE_H
#define WEB_TEST_HTTPRESPONSE_H
#include "unordered_map"
#include "fcntl.h"
#include "unistd.h"
#include "sys/stat.h"
#include "sys//mman.h"
#include "assert.h"

#include "buffer.h"

namespace tcj{
    class HTTPresponse {
    public:
        HTTPresponse();
        ~HTTPresponse();

        void init(const std::string& srcDir,std::string& path,bool isKeepAlive=false,int code=-1);
        void makeResponse(Buffer& buffer);  // 生成报文的主要函数
        void unmapFile();   // 共享内存的扫尾函数
        char* file();
        size_t fileLen();
        void errorContent(Buffer& buffer,std::string message);  // 所请求文件打不开，返回相应的错误信息
        int code() const {return code_;}
    private:
        // 生成请求行，请求头，数据体
        void addStateLine_(Buffer& buffer);
        void addResponseHeader_(Buffer& buffer);
        void addResponseContent_(Buffer& buffer);

        void errorHtml_();
        std::string getFileType_(); // 得到文件类型

        int code_;          // 表示http的状态
        bool isKeepALive_;  // 表示http链接是否处于keepalive状态

        std::string path_;  // 解析到的路径
        std::string srcDir_; // 根路径

        char* mmFile_;           // mmap共享文件
        struct stat mmFileStat_; //


        // 后缀名到文件路径的映射
        static const std::unordered_map<std::string,std::string> SUFFIX_TYPE_;
        // 状态码到响应状态的（字符串类型）的映射
        static const std::unordered_map<int,std::string> CODE_STATUS_;
        // 哈希表提供了4xx状态码到响应文件路径的映射
        static const std::unordered_map<int,std::string> CODE_PATH_;
    };

}


#endif //WEB_TEST_HTTPRESPONSE_H
